package com.bright.ghj.overt.service;

import com.bright.ghj.common.pojo.vo.PageVO;
import com.bright.ghj.overt.pojo.command.ImportAccessCommand;
import com.bright.ghj.overt.pojo.dto.AttachedDTO;
import com.bright.ghj.overt.pojo.dto.ExportExcelDTO;
import com.bright.ghj.overt.pojo.dto.ImportExcelDTO;
import com.bright.ghj.overt.pojo.dto.TableDataDTO;
import com.bright.ghj.overt.pojo.query.OpenReportRecordQuery;
import com.bright.ghj.overt.pojo.query.TableDataIdQuery;
import com.bright.ghj.overt.pojo.query.TableDataQuery;
import com.bright.ghj.overt.pojo.vo.*;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;

public interface BaseDataService {
    /**
     *
     * @param tableName
     * @return
     */
    List<TableHeaderVO> listTableHeaders(String tableName);

    /**
     * 分页获取公开表数据内容
     *
     * @param tableDataQuery
     * @return
     */
    TablePageVO<Map<String, Object>> pageTableData(TableDataQuery tableDataQuery);

    /**
     * 分页获取公开表数据内容 按openReportRecord的id
     *
     * @param tableDataIdQuery
     * @return
     */
    TablePageVO<Map<String, Object>> pageTableData(TableDataIdQuery tableDataIdQuery);

    /**
     * 不分页获取公开表数据内容
     *
     * @param tableDataQuery
     * @return
     */
    TablePageVO<Map<String, Object>> listTableData(TableDataQuery tableDataQuery);

    /**
     * 不分页获取公开表数据内容 按openReportRecord的id
     *
     * @param tableDataIdQuery
     * @return
     */
    TablePageVO<Map<String, Object>> listTableData(TableDataIdQuery tableDataIdQuery);


    /**
     * 保存数据表内容
     * @param tableDataDTO
     */
    SaveResultVO saveTableData(TableDataDTO tableDataDTO) throws Exception;

    /**
     * 获取openReportRecord数据列表 分页
     * @param query
     * @return
     */
    PageVO<OpenReportRecordVO> listOpenReportRecordByPage(OpenReportRecordQuery query, int listType);

    /**
     * 获取表基本信息
     * @param tableDataIdQuery
     * @return
     */
    TableInfoVO getTableInfo(TableDataIdQuery tableDataIdQuery);

    /**
     * 导出excel
     * @param exportExcelDTO
     * @param response
     */
    void exportExcel(ExportExcelDTO exportExcelDTO, HttpServletResponse response) throws IOException;

    /**
     * 导出excel(使用模板文件)
     * @param exportExcelDTO
     * @param response
     * @param isTemplate 是否导出模板文件
     */
    void exportExcelByTemplate(ExportExcelDTO exportExcelDTO, HttpServletResponse response, boolean isTemplate) throws IOException;

    /**
     * 导入excel
     * @param importExcelDTO
     * @param newExcel
     */
    SaveResultVO importExcel(ImportExcelDTO importExcelDTO, File newExcel) throws IOException;

    @Transactional
    SaveResultVO importExcelNew(ImportExcelDTO importExcelDTO, MultipartFile newExcel) throws IOException;

    /**
     * 导入Access
     *
     * @param importExcelDTO
     * @param accessFile
     * @param advanceProgressConsumer 传计算实时进度的方法 每走完一轮会调用一次
     * @return
     * @throws IOException
     */
    List<SaveResultVO> importAccess(ImportAccessCommand importExcelDTO, File accessFile, Consumer<Void> advanceProgressConsumer) throws Exception;


    /**
     *
     * @param tableDataIdQuery
     * @return
     */
    List<AttachedVO> viewAttachedFiles(TableDataIdQuery tableDataIdQuery);

    /**
     * 保存附件表信息
     * @param attachedDTOS
     * @param tableDataIdQuery
     */
    void saveAttachedFiles(List<AttachedDTO> attachedDTOS, TableDataIdQuery tableDataIdQuery);

    void deleteAttachedData(List<Integer> attachedIds);

    /**
     * 按id删除open表数据
     * @param ids
     * @return
     */
    SaveResultVO deleteOpenReportRecordByIds(int[] ids);

    /**
     * 调用存储过程自动生成openReportRecord表数据 一般用于定时任务执行
     * @param query 条件
     */
    void autoCreateOpenReportRecord(OpenReportRecordQuery query);

    /**
     * 获取页面上要显示的打印按钮
     * @param tableDataIdQuery
     * @return
     */
    List<ButtonVO> getPrtBtns(TableDataIdQuery tableDataIdQuery);
}
